图解SOC中的Timer(一):系统里有哪些Timer?
Ftrace训练营火热报名中:Ftrace训练营:站在设计者的角度来理解ftrace(限50人)。训练营第一期报名已圆满成功,好评如潮。第二期报名正在火爆进行中(咨询小月微信:linuxer2016)。
ARM安全架构训练营火热报名中:阅码场训练营:ARM安全架构之Trustzone-TEE实战。报名咨询客服(小月微信:linuxer2016)。
ARM架构与调优调试训练营火热报名中:阅码场训练营:ARM架构与调试调优。报名咨询客服(小月微信:linuxer2016)。
作者简介:
Baron (csdn:代码改变世界ctw),九年手机安全/SOC底层安全开发经验。擅长trustzone/tee安全产品的设计和开发
说明:
本文讲述的是armv8-aarch64、armv9架构 在设计模式上,本文带有一些个人的见解,如有不同的见解,可以评论区或微信群参与讨论。
思考:
1、一个大的系统里,有多少个Timer?这些Timer的作用分别是什么?这些Timer有什么区别?它们的精确度有什么不同吗?
2、Linux Kernel的Tick使用的是哪个Timer?watchdog是用的哪个Timer?
3、一个ARM Core里有又多少个Timer?不同软件系统中的Timer的使用方式有何不同吗?
4、应用程序中的
setitimer()
这样的函数是否会调用到底层程序?5、应用程序要读取当前系统时间戳的时候,是否需要调用到kernel space? 在glibc中是否就可以实现了?
6、什么是arch timer?什么是SOC Timer、apb timer、memory-mapped timer?
7、对于arch timer,又分为物理timer和虚拟timer?那么什么时候使用物理timer,什么时候使用虚拟timer?为什么?
8、EL1和S-EL1中使用的arch timer是如何隔离的?(这里所说的隔离是指寄存器如何隔离的,中断如何隔离的) 9、EL3 Physical Timer对应的寄存器为什么是xxxEL1, 不应该是xxxEL3吗?
1、系统里面有多少个Timer?
如上图所示,在一个SOC中一定/可能存在:
core timer(也叫arch timer),每个core中都有这个Timer
SOC Timer(也叫apb timer、memory-mapped Timer),可能会有多个,可以存在以下这样的:
(1) 、一个专门给Non-secure 使用的timer
(2) 、一个专门给Secure 使用的timer
(3) 、一个专门用于特定用途的timer
(4) 、绑定core的Timer,例如8个timer,固定某个timer给某个core使用
2、每一个core里面又有多少个Timer
2.1、四个物理Timer
EL1 Physical Timer 不区分secure和non-secure,但在ATF的switch cpucontext的时候,会保存和恢复相关寄存器,所以从软件视角来看是有两套寄存器,也就是有
non-secure EL1PhysicalTimer
和secure EL1PhysicalTimer
,这也是最最理想的设计方案。然而非常非常非常非常的遗憾的是,寄存器通过软件switch cpucontext可以变成2套,但中断呢?中断是无法同时给non-secure和secure同时使用的,也无法做到中断在Security State之间的隔离。既然这样,说明这样的硬件是一个"非常严重"的问题,那么我们看下软件是怎么使用的呢?(1)Linux Kernel正常使用,在读取counter值、counter频率的同时,也会设置CTL、CVAL、TVAL等相关寄存器,也会触发和处理30中断(EL1 Physical Timer的默认中断号是30);
(2)optee中,仅仅是读取counter值、counter频率的同时,就可以计算时间戳了。optee不会读取CTL、CVAL、TVAL等相关寄存器,当然也不会触发和处理30中断了。
以上便是软件基于“硬件缺陷”而进行的设计,自然也不会出现什么问题。然后你说ARM Timer有缺陷就有缺陷了?你真的懂它们的设计吗?事实上ARM的设计中,也考虑了上面描述的问题。你仔细看看它的
EL3PhysicalTimer
,他的寄存器的名字竟然是xxx_EL1
(而不是xxx_EL3
),也就是说它本身就是想给secure security用的(EL3也属于secure security)。另外我也参考了具体的arm core trm手册,发现EL3PhysicalTimer
所对应的中断号(29号中断)的signal configuration描述为"Secure EL1 Pyhsical Timer"。我们再查一下BL32(Secure EL1)的参考程序trusted-firmware-a/bl32/tsp/tsp_timer.c
, 它操作的也正是EL3PhysicalTimer
。总结:
(1)、
EL1PhysicalTimer
不区分secure和non-secure,在secure和non-secure之间也无法做到隔离。一般情况下它是给NS-EL1使用的。当然S-EL1如果是仅仅读取counter和频率获取当前时间戳,也是可以用的,但这不应该是建议的。因为这样造车non-secure也可以窃取到secure侧的时间戳。(2)、
EL3PhysicalTimer
的本意就是想给secure用的,包括EL3和S-EL1EL2 Physical Timer 给non-secure EL2使用的
S-EL2 Physical Timer 给secure EL2使用的
EL3 Physical Timer 给Secure使用的,包括EL3和S-EL1
2.2、三个虚拟Timer
EL1VirtualTimer
主要是给EL1 OS(guest os)使用的,那么对于一个操作系统,它到底是使用 EL1PhysicalTimer
还是使用 EL1VirtualTimer
? 由宏控决定,在编译的时候就决定了。例如你这个OS没有跑在VM中,那么就使用 EL1PhysicalTimer
,如果你这个OS是要跑在VM中的,那么就使用 EL1VirtualTimer
EL2PhysicalTimer
是很好理解的,就是给EL2管理程序使用的嘛,但是 EL2VirtualTimer
是给谁用的呢? 这里就需要一点虚拟化的概念了, EL2VirtualTimer
是给Host App使用的。
作者上一篇文章:SOC的多核启动流程详解
精华文章:【精华】Linux阅码场原创精华文章汇总
阅码场付费会员专业交流群
会员招募:各专业群会员费为88元/季度,权益包含群内提问,线下活动8折,全年不定期群技术分享(普通用户直播免费,分享后每次点播价为19元/次),有意加入请私信客服小月(小月微信号:linuxer2016)
专业群介绍:
彭伟林-阅码场内核性能与稳定性本群定位内核性能与稳定性技术交流,覆盖云/网/车/机/芯领域资深内核专家,由阅码场资深讲师彭伟林主持。甄建勇-性能优化与体系结构
本群定位Perf、cache和CPU架构技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师甄建勇主持。
李春良-Xenomai与实时优化
本群定位Xenomai与实时优化技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师李春良和彭伟林共同主持。
周贺贺-Tee和ARM架构
本群定位Tee和ARM架构技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师周贺贺主持。
谢欢-Linux tracers
本群定位Linux tracers技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师谢欢主持。
✦
✦